<?php
/**
* @file MessageService.php
* Copyright (c) Friends Group. All rights reserved.
* $Id$
*
*/

require_once(realpath(dirname(__FILE__)) . '/classes/Message.php');
require_once(realpath(dirname(__FILE__)) . '/classes/ArchivedMessage.php');
require_once(realpath(dirname(__FILE__)) . '/classes/SystemMessage.php');
require_once(realpath(dirname(__FILE__)) . '/classes/UserMessage.php');
require_once(realpath(dirname(__FILE__)) . '/classes/MessageType.php');
require_once(realpath(dirname(__FILE__)) . '/classes/RoomMessage.php');
require_once(realpath(dirname(__FILE__)) . '/interfaces/IMessageService.php');
require_once(realpath(dirname(__FILE__)) . '/DataService.php');
require_once(realpath(dirname(__FILE__)) . '/UserService.php');
require_once(realpath(dirname(__FILE__)) . '/ChatService.php');

class MessageService implements IMessageService 
{

    public function __construct()
    {
        $this -> repo = new DataService();
    }
    
    /**
     * @ReturnType void
     * @ParamType senderId 
     * @ParamType receiverId 
     * @ParamType message //Mot kieu string
     * @ParamType type 
     * Gửi message từ user này đến user khác
     */
    public function sendUserMessage($senderId, $receiverId, $message, $type) 
    {
        $us = new UserService();
        $sender = $us -> findUserById($senderId);
        $receiver = $us -> findUserById($receiverId);
        
        $message -> setMarkAsRead("");
        $message -> setPostTime(date("Y-m-d H:i:s"));
        $message -> setMessageTypeID($type -> getID());
        $this -> repo -> create($message);
        
        $cm = new CommonService();
        // system message
        if($cm -> getMessageTypeByName("Warning") -> getID() == $type -> getID() || $cm -> getMessageTypeByName("Alert") -> getID() == $type -> getID())
        {
            $this -> repo -> create(new SystemMessage($receiverId, $message -> getMessages(), $type -> getMessageType(), $message -> getPostTime()));
        }
        
        // save user message
        if($us -> getUserOption($senderId, "save-message") == "1")
            $this -> repo -> create(new ArchivedMessage($senderId, $receiverId, $message -> getMessages(), $message -> getPostTime()));
        
        $newUserMessage = new UserMessage($senderId, $receiverId, $message->getID());
        $this -> repo -> create($newUserMessage);
    }
    
    /**
     * @ReturnType classes.Message
     * @ParamType userId 
     * Lấy các message gửi cho user
     */
    public function getUserMessages($userId) 
    {
        $us = new UserService();
        $user = $us -> findUserById($userId);
        
        $messages = $this -> repo -> getList("SELECT * FROM Message JOIN UserMessage ON UserMessage.messageID = Message.ID WHERE UserMessage.receiverId = '$userId' AND (Message.markAsRead IS NULL OR Message.markAsRead = '')", "Message");
        
        if(count($messages) > 0)
        {
            foreach ($messages as $ms)
            {
                if($us -> getUserOption($userId, "save-message") == "1")
                {
                    $this -> repo -> create(new ArchivedMessage($ms -> getProperty("receiverID"), $ms -> getProperty("senderID"), $ms -> getMessages(), $ms -> getPostTime()));
                }
                $nms = new Message($ms->getMessages(), $ms->getMessageTypeID(), $userId, $ms->getPostTime());
                $nms -> setID($ms->getID());
                $this -> repo -> update($nms);
            }
        }
        
        $this -> removeReadMessage();
        
        return $messages;
    }
    
    function removeReadMessage()
    {
        $gms = $this -> repo -> getList("SELECT * FROM Message WHERE (markAsRead <> '')", "Message");
        if(count($gms) > 0)
        {
            foreach ($gms as $ms)
            {
                $this -> repo -> delete($ms);
            }
        }
    }
    /**
     * @ReturnType void
     * @ParamType senderId 
     * @ParamType roomId 
     * @ParamType message 
     * @ParamType type 
     * Gửi message cho toàn room
     */
    public function sendRoomMessage($senderId, $roomId, $message, $type) 
    {
        //---------------Kiểm tra dữ liệu-----------------
        $us=new UserService();
        $cs=new ChatService();
        //Kiểm tra Id người gửi
        if($us->isExistUserId($senderId)!=true)
            throw new Exception("Không tìm thấy Id người gửi");
            
        //Kiểm tra RoomId
        if($cs->isExistdRoomId($roomId)!=true)
            throw new Exception("Không tìm thấy roomId");
            
        //Kiểm tra class Message
        if(is_string($message)!=true)
            throw new Exception("Kiểu tham số không hợp lệ. User phải là 1 đối tượng String");

        //Kiểm tra class $type
        if(get_class($type)!='MessageType')
            throw new Exception("Kiểu tham số không hợp lệ. User phải là 1 đối tượng MessageType");
        
        //-----------------Ghi vào database ---------------------
            
        //Ghi vao bang Message
        
        try
        {
            $newMessage=new Message();
            $newMessage->setMessages($message);
            $newMessage->setMarkAsRead("unread");
            //Set ngày theo dạng d-m-y giờ-phút-giây
            $now=date('y-m-d H:i:s');
            $newMessage->setPostTime($now);
            //Set Ngày
            $newMessage->setMessageTypeID($type->getID());
            $this->repo->create($newMessage);
        }
        catch(Exception $e)
        {
            throw new Exception("Không thể ghi vào bảng dữ liệu Message");
        }
        
        //Ghi vao bang UserMessage
        try
        {
            //Tao doi tuong newRoomMessage
            $newRoomMessage=new RoomMessage();
            $newRoomMessage->setSenderID($senderId);
            $newRoomMessage->setChatRoomID($roomId);
            $newRoomMessage->setMessageID($newMessage->getID());
            //Ghi vao bang UserMessage
            $this->repo->create($newRoomMessage);
        }
        catch(Exception $e)
        {
            throw new Exception("Không thể ghi vào bảng dữ liệu UserMessage");
        }
    }

    /**
     * @ReturnType classes.Message
     * @ParamType roomId 
     * @ParamType newOnly 
     * Lấy các messgae trong room, chỉ lấy các message mới nếu newOnly = true
     */
    public function getRoomMessages($roomId, $newOnly = false) 
    {
        $cs=new ChatService();
        //Kiểm tra RoomId
        if($cs->isExistdRoomId($roomId)!=true)
            throw new Exception("Không tìm thấy roomId");
        if($newOnly!=true)
        {
            $UserMessages = $this->repo->getList("select * from UserMessage where ReceiverID=$roomId","UserMessage");
            if($USerMessages)
                return $UserMessages;
            else
                return false;
        }
        else
        {
            throw new Exception("Not implement yet");
        }
    }

    /**
     * @ReturnType Boolean
     * @ParamType messageId 
     * @ParamType roomId 
     * Kiểm tra xem message đã được user đọc chưa
     */
    public function isNewMessage($messageId, $roomId = null) 
    {
        throw new Exception("Not implement yet");
    }

    /**
     * @ReturnType Object
     * @ParamType messageId 
     * Lấy kiểu message
     */
    public function getMessageType($messageId) 
    {
        throw new Exception("Not implement yet");
    }

    /**
     * @ReturnType void
     * @ParamType messageId 
     * @ParamType type 
     * Set kiểu message
     */
    public function setMessageType($messageId, $type) 
    {
        throw new Exception("Not implement yet");
    }

    /**
     * @ReturnType void
     * @ParamType userId 
     * @ParamType message 
     * Lưu các message của user (chỉ có tác dụng khi user bật tính tùy chọn lưu)
     */
    public function saveUserMessage($userId, $message) 
    {
        $us = new UserService();
        $us -> findUserById($userId);
        
        $this -> repo -> create(new ArchivedMessage($message -> getReceiverId(), $message -> getSenderID, $message -> getMessage(), $message -> getPostTime()));
    }

    /**
     * @ReturnType Object
     * @ParamType userId 
     * Lấy các message đã lưu của user
     */
    public function getArchivedMessages($userId) 
    {
        $us = new UserService();
        $us -> findUserById($userId);
        
        return $this -> repo -> getList("SELECT * FROM ArchivedMessage WHERE accountID = '$userId'", "ArchivedMessage");
    }

    /**
     * @ReturnType Object
     * @ParamType userId 
     * Lấy message của hệ thống, nếu userId != null sẽ lấy các message của userId
     */
    public function getSystemMessages($userId = null) 
    {
        if($userId != null)
        {
            $user = $this -> findUserById($userId);
            return $this -> repo -> getList("SELECT * FROM SystemMessage WHERE accountID = '$userId'", "SystemMessage");
        }
        else
            return $this -> repo -> getList("SELECT * FROM SystemMessage", "SystemMessage");
    }
}

?>